const {prisma, minioClient, mqttClient}=require('./utils.js')

class UserController{
    /**
     * GET：验证用户登录
     * @param {*} req.query.mobile_email 用户登录凭证
     * @param {*} req.query.password 用户密码
     * @returns userinfo:{...}
     * 
     * 409 手机号或邮箱格式有误
     * 404 未找到用户
     * 401 密码错误
     * 500 内部错误
     * 200 返回用户信息
     */
    async login(req,res){
        const user=req.query
        var is_mobile=/^0?(13|14|15|18|19|17)[0-9]{9}$/.test(user.mobile_email)
        var is_email=/^\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}$/.test(user.mobile_email)
        if(is_mobile==false&&is_email==false){
            res.send(409)
            return
        }
        var ret=await prisma.user.findFirst({
            where:{
                OR:[
                    {mobile:user.mobile_email},
                    {email:user.mobile_email}
                ]
            },
            include:{
                talent:{
                    include:{
                        level2s:true
                    }
                },
                organization:true,
            }
        })
        if(ret==null) {
            res.send(404)
            return
        }
        if(ret.password!=user.password) {
            res.send(401)
            return
        }
        res.send(200,ret)
    }

    /**
     * GET：获取用户信息（后期需要添加token验证）
     * @param {*} req.params.user_id
     * @returns
     * 404 未找到用户
     * 500 内部错误
     * 200 返回用户信息
     */
    get(req,res,next){
        var user_id=Number(req.params.user_id)
        prisma.user.findUnique({
            where:{id:user_id},
            include:{
                talent:{
                    include:{
                        level2s:true
                    }
                },
                organization:true,
            }
        }).then(user=>{
            if(user==null){
                res.send(404)
                next()
            }else{
                res.send(200,user)
                next()
            }
        }).catch(err=>{
            console.log(err)
            res.send(500)
            next()
        })
    }

    /**
     * GET：获取realtime_data
     * @param {*} req.params.user_id
     * @returns
     * 404 未找到用户
     * 500 内部错误
     * 200 返回用户信息
     */
    async realtime_data(req,res){
        var user_id=Number(req.params.user_id)
        var user=await prisma.user.findUnique({where:{id:user_id}})
        if(user==null){
            res.send(404)
        }
        var realtime_data=[]
        //用户收到的提醒信息
        var notifications=await prisma.notification.findMany({
            where:{user_id:user_id}
        })
        realtime_data.push({key:'notifications', value:notifications})
        //审核员的实时数据
        if(user.auditor){
            //待审核专家数
            var talent_audit_count=await prisma.talentAudit.count()
            realtime_data.push({key:'talent_audit_count',value:talent_audit_count})
        }
        res.send(200,realtime_data)
    }

    /**
     * POST：用户注册
     * @param {*} req.body.name
     * @param {*} req.body.id_code
     * @param {*} req.body.mobile
     * @param {*} req.body.email
     * @param {*} req.body.password1
     * @param {*} req.body.password2
     * @returns
     * 406 数据格式有误
     * 409 unique约束冲突
     * 500 内部错误
     * 200 返回用户信息
     */
    register(req,res,next){
        const user=req.body
        if(/^0?(13|14|15|18|19|17)[0-9]{9}$/.test(user.mobile)==false||
        /^\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}$/.test(user.email)==false||
        /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(user.id_code)==false||
        user.name==''||user.password1==''){
            res.send(406)
            next()
            return
        }

        prisma.user.create({
            data:{
                name:user.name,
                id_code:user.id_code,
                mobile:user.mobile,
                email:user.email,
                password:user.password1
            }
        }).then(created_user=>{
            res.send(200,created_user)
            next()
        }).catch(e=>{
            if(e.code=='P2002'){
                res.send(409)
                next()
            }else{
                res.send(500)
                next()
            }
        })
    }

    /**
     * POST：用户信息修改
     * @param {*} req.body.id
     * @param {*} req.body.name
     * @param {*} req.body.id_code
     * @param {*} req.body.mobile
     * @param {*} req.body.email
     * @param {*} req.body.password
     * @returns
     * 406 数据格式有误
     * 409 unique约束冲突
     * 500 内部错误
     * 200 返回用户信息
     */
    modify(req,res,next){
        const user=req.body
        if(/^0?(13|14|15|18|19|17)[0-9]{9}$/.test(user.mobile)==false||
        /^\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}$/.test(user.email)==false||
        /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(user.id_code)==false||
        user.name==''||user.password1==''){
            res.send(406)
            next()
            return
        }

        prisma.user.update({
            where:{id:user.id},
            data:user
        }).then(modified_user=>{
            res.send(200,modified_user)
            next()
        }).catch(e=>{
            if(e.code=='P2002'){
                res.send(409)
                next()
            }else{
                res.send(500)
                next()
            }
        })
    }
}

module.exports=new UserController()